三种测试方法

[ expression ]【[空格expression空格],别忘了空格】

[[ expression ]]

test expression

整数测试

-gt,-lt,-eq,-ne,-ge,-le

INT1=11 INT2=22 [ $INT1 -eq $INT2 ]或[[ $INT1 -eq $INT2 ]]或test $INT1 -eq $INT2

执行结果和状态码的区别

if 条件,这个"条件"是0的时候代表成功,这个"条件"在"if"后面是个状态码

只有使用上面的整数测试的条件的时候才用"[]",如果测试成立返回的状态码是0

USERNAME=user1

1、 if grep "^$USERNAME>" /etc/passwd; then 【正确,grep返回的是个状态码】

2、 if [ grep "^$USERNAME>" /etc/passwd ]; then 【错误,只有使用上面的整数测试的条件的时候才用"[]"】

3、 if [ grep "^$USERNAME\>" /etc/passwd -eq 0 ]; then 【错误,grep返回的是命令的执行结果,一行内容,根本不是状态码,在"if"后面才是状态码】

4、 if [ grep "^$USERNAME\>" /etc/passwd | cut -d: -f3 -eq 0 ]; then 【如果$USERNAME的UID是0,该条件就成立,否则错误】

5、 if grep "^$USERNAME\>" /etc/passwd | cut -d: -f3; then 【这个首先执行grep,如果$USERNAME的UID是0,if把0当作状态码,该条件就成立,否则也是错误的】

文件测试

  • -e FILE:测试文件是否存在

  • -d FILE:测试文件是否是目录

  • -f FILE:测试文件是否是普通文件

  • -r FILE:测试当前用户对该文件是否有读取的权限

  • -w

  • -x

[root@jiakang ~]# [ -d aaa ]
[root@jiakang ~]# echo $?
1
[root@jiakang ~]# [ -d a ]
[root@jiakang ~]# echo $?
0

定义脚本退出状态码

exit :退出脚本,停止脚本的执行【类似php的exit和die】

exit 8【定义退出状态码是8】

测试脚本是否有语法错误

  • bash -n 脚本

  • bash -x 脚本 :单步执行

[root@jiakang a]# cat testif.sh
#!/bin/bash
FILE=/etc/inittabs
if [ -e $FILE ];then
echo "OK"
else 
 echo "找不到文件"
f
[root@jiakang a]# bash -n testif.sh
testif.sh: line 8: syntax error: unexpected end of file


[root@jiakang a]# cat testif.sh
#!/bin/bash
FILE=/etc/inittabs
if [ -e $FILE ];then
echo "OK"
else 
 echo "找不到文件"
fi
[root@jiakang a]# bash -x testif.sh
+ FILE=/etc/inittabs
+ '[' -e /etc/inittabs ']'
+ echo $'\346\211\276\344\270\215\345\210\260\346\226\207\344\273\266'
找不到文件
[root@jiakang a]# echo $?
0【这个状态码是最后echo "找不到文件"返回的,echo输出的是最后一个命令的状态码】

字符串测试

  • ==

  • !=

  • >

  • <

  • -n string :测定指定字符串是否为空,空则真,不空则假

  • -z string :测定指定字符串是否不空,不空则真,空则假

[ 字符串 == 字符串 ]【[空格 字符串 空格==空格 字符串 空格],注意==两侧都有空格】

[[ 字符串 == 字符串 ]]

[root@jiakang ~]# A="aaa"
[root@jiakang ~]# B="bbb"
[root@jiakang ~]# [ $A == $B ]
[root@jiakang ~]# echo $?
1
[root@jiakang ~]# [ $A != $B ]
[root@jiakang ~]# echo $?
0

for循环

用法:for 变量 in 列表; do 循环体 done

例如: for I in 1 2 3 4 5; do 加法运算 done

常用生成列表的方法

  • {1..100}

  • seq [起始数 [跳数]] 结束数

[root@jiakang ~]# seq 5
1
2
3
4
5
[root@jiakang ~]# seq 3 5
3
4
5
[root@jiakang ~]# seq 3 2 8
3
5
7

声明整数

  • let SUM

  • declare -i SUM

[root@jiakang a]# cat testfor.sh
#!/bin/bash
declare -i SUM=0
for I in `seq 1 2 100 ` ;do
 let SUM=$[$SUM+$I]
done

echo "sum=$SUM"
[root@jiakang a]# ./testfor.sh  
sum=2500

[root@jiakang a]# cat testfor.sh
#!/bin/bash
declare -i SUM=0
for I in {1..100};do
 let SUM=$[$SUM+$I]
done

echo "sum=$SUM"
[root@jiakang a]# ./testfor.sh  
sum=5050

Big_fat_cat
207 声望10 粉丝